import config from '@/config/app';
import request from './request.js';
import cache from './cache';
// #ifdef H5
import checkEnvironment from './browser';
// #endif


const util = {
	// 请求地址
	requestUrl() {
		return config.HTTP_REQUEST_URL;
	},
	// 时间戳转日期格式
	timestampToDate(timestamp, formatter = 'Y-m-d H:i:s') {
		console.log('时间戳长度', timestamp, String(timestamp).length);
		// 需要将时间戳转换为毫秒级
		if (String(timestamp).length !== 13) {
			timestamp = Number(timestamp) * 1000;
		}

		const date = new Date(timestamp);
		const year = date.getFullYear();
		const month = (date.getMonth() + 1).toString().padStart(2, '0');
		const day = date.getDate().toString().padStart(2, '0');
		const hours = date.getHours().toString().padStart(2, '0');
		const minutes = date.getMinutes().toString().padStart(2, '0');
		const seconds = date.getSeconds().toString().padStart(2, '0');

		if (formatter == 'Y-m-d') {
			return `${year}-${month}-${day}`;
		} else if (formatter == 'Y-m-d H:i') {
			return `${year}-${month}-${day} ${hours}:${minutes}`;
		} else if (formatter == 'Y年m月d日') {
			return `${year}年${month}月${day}日`;
		} else if (formatter == 'Y年m月d日 H:i') {
			return `${year}年${month}月${day}日 ${hours}:${minutes}`;
		} else if (formatter == 'Y年m月d日 H:i:s') {
			return `${year}年${month}月${day}日 ${hours}:${minutes}:${seconds}`;
		} else {
			return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
		}
	},
	// 日期字符串转时间戳
	formatToTimestamp(dateString) {
		const timestamp = new Date(dateString).getTime();
		return timestamp;
	},
	// 文本消息提示
	showTip(msg, icon = "none", mask = false, duration = 2000) {
		uni.showToast({
			title: msg,
			icon: icon,
			mask: mask,
			duration: duration,
		})
	},
	// 获取定位信息
	getLocation() {
		let geocode = false;
		// #ifdef MP || APP
		geocode = true;
		// #endif

		let longitude = cache.get('longitude', false) || '';
		let latitude = cache.get('latitude', false) || '';
		console.log('位置信息缓存', longitude, latitude);

		if (!longitude || !latitude) {
			return new Promise((resolve, reject) => {
				uni.getLocation({
					type: 'gcj02',
					altitude: true,
					geocode: geocode,
					success: res => {
						console.log('获取定位', res);
						cache.set('longitude', res.longitude); //缓存经度
						cache.set('latitude', res.latitude); //缓存纬度
						resolve(res);
					},
					fail: err => {
						console.error("currentLocation fail", err);
						uni.showModal({
							title: '提示',
							showCancel: false,
							content: '获取定位信息失败，请检查设备是否启用定位功能！'
						});
						reject(err);
					}
				})
			})
		}
	},
	// 获取系统信息
	getSystemInfo() {
		let systemInfo = cache.get('systemInfo');
		console.log('系统信息缓存', systemInfo);
		if (!systemInfo || systemInfo.length == 0) {
			request.get('index/getSystemInfo').then(res => {
				console.log('系统信息', res);
				if (res.data) {
					cache.set('systemInfo', res.data);
				}
			})
		}
	},
	// 获取主题
	getTheme() {
		let themeColor = cache.get('themeColor');
		console.log('主题缓存', themeColor);
		if (!themeColor || themeColor.length == 0) {
			request.get('index/getTheme').then(res => {
				console.log('主题', res);
				if (res.data) {
					themeColor = {
						'name': res.data.name,
						'color': res.data.color,
						'theme': res.data.color_picker,
						'gradient': res.data.gradient_color,
					};
					cache.set('themeColor', themeColor);
				}
			})
		}
	},
	containsHttp(str) {
		if (/http:/.test(str)) {
			return true;
		} else if (/https:/.test(str)) {
			return true;
		} else {
			return false;
		}
	},
	// 检查登录状态
	checkLogin() {
		const token = util.getToken();
		console.log('登录Token', token);
		const role = cache.get('role', false) || "";
		console.log('登录角色', role);

		if (token) {
			switch (role) {
				case '1':
					// 商户
					uni.reLaunch({
						url: '/merchantPages/index/index'
					});
					break;
				case '2':
					// 门店
					uni.reLaunch({
						url: '/shopPages/index/index'
					});
					break;
				case '3':
					// 代理
					uni.reLaunch({
						url: '/agentPages/index/index'
					});
					break;
				case '4':
					// 师傅
					uni.reLaunch({
						url: '/masterPages/index/index'
					});
					break;
				case '5':
					// 员工
					uni.reLaunch({
						url: '/staffPages/index/index'
					});
					break;
				default:
					// 角色异常
					console.log('获取角色异常跳转');
					cache.logOut();
					cache.clear('role');
					uni.reLaunch({
						url: '/pages/login/login'
					})
					break;
			}
		} else {
			console.log('Token为空跳转');
			cache.logOut();
			cache.clear('role');
			uni.reLaunch({
				url: '/pages/login/login'
			})
		}
	},
	// 跳转登录页
	toLogin() {
		const pages = getCurrentPages();
		const currentPage = pages[pages.length - 1];
		const currentRoute = currentPage.route;
		cache.set('jumpRoute', currentRoute);

		uni.navigateTo({
			url: '/pages/login/login'
		})
	},
	// 验证用户名非空
	username(str, msg = "用户名") {
		if (!str || str.length == 0) {
			this.showTip(msg + "不能为空");
			return false;
		}
		return true;
	},
	// 验证密码长度及复杂度
	password(str, len = 6, factor = 2) {
		if (!str || str.length == 0) {
			this.showTip("密码不能为空");
			return false;
		}
		// let regex = /^(?=.*\d)(?=.*[A-Za-z]).+$/;
		// let regex = /^(?=.*\d)(?=.*[A-Za-z])[A-Za-z\d]{6,}$/;
		let regex = new RegExp(`^(?=.*\\d)(?=.*[A-Za-z])[A-Za-z\\d]{${len},}$`);

		// 复杂度验证
		if (factor <= 2) {
			// 大小写字母+数字（至少两种）
			// console.log(regex);
			if (!regex.test(str)) {
				this.showTip("密码至少包含一个大小写字母、一个数字，且长度不小于" + len + "位");
				return false;
			}
		} else if (factor == 3) {
			// 大小写字母+数字+特殊字符（至少三种）
			// regex = /^(?=.*\d)(?=.*[A-Za-z])(?=.*[~!@#%^&()_\-\+=<>?,\.;]).+$/;
			regex = new RegExp(
				`^(?=.*\\d)(?=.*[A-Za-z])(?=.*[~!@#%^&()_\\-\\+=<>?,\\.;])[A-Za-z\\d~!@#%^&()_\\-\\+=<>?,\\.;]{${len},}$`
			);
			// console.log(regex);
			if (!regex.test(str)) {
				this.showTip("密码至少包含一个大小写字母、一个数字及一个特殊字符，且长度不小于" + len + "位");
				return false;
			}
		} else {
			// 必须包含大小写字母、数字和特殊字符
			// regex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#%^&()_\-\+=<>?,\.;]).+$/;
			regex = new RegExp(
				`^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#%^&()_\\-\\+=<>?,\\.;])[A-Za-z\\d~!@#%^&()_\\-\\+=<>?,\\.;]{${len},}$`
			);
			// console.log(regex);
			if (!regex.test(str)) {
				this.showTip("密码必须包含一个大写字母、一个小写字母、一个数字及一个特殊字符，且长度不小于" + len + "位");
				return false;
			}
		}
		return true;
	},
	// 验证手机号
	mobile(str, msg = "手机号码") {
		if (!str || str.length == 0) {
			this.showTip(msg + "不能为空");
			return false;
		}
		const regex = new RegExp(`^1[3-9]\\d{9}$`);
		if (!regex.test(str)) {
			this.showTip(msg + "输入不规范");
			return false;
		}
		return true;
	},
	// 验证座机号
	telphone(str) {
		if (!str || str.length == 0) {
			this.showTip("座机号码不能为空");
			return false;
		}
		const regex = new RegExp(`^[0]\d{2}-\d{8}$|^[0]\d{3}-\d{8}$`);
		if (!regex.test(str)) {
			this.showTip("座机号码输入不规范");
			return false;
		}
		return true;
	},
	// 验证邮箱
	email(str) {
		if (!str || str.length == 0) {
			this.showTip("邮箱不能为空");
			return false;
		}
		const regex = new RegExp(
			`^([a-z0-9A-Z]+[-_\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$`);
		if (!regex.test(str)) {
			this.showTip("邮箱格式错误");
			return false;
		}
		return true;
	},
	// 验证身份证
	idcard(str) {
		if (!str || str.length == 0) {
			this.showTip("身份证号码不能为空");
			return false;
		}
		const regex = new RegExp(
			`^[1-9]\d{5}(?:18|19|20)\d{2}(?:0\d|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$`);
		if (!regex.test(str)) {
			this.showTip("身份证号码格式错误");
			return false;
		}
		return true;
	},
	// 验证护照
	passport(str) {
		if (!str || str.length == 0) {
			this.showTip("护照号码不能为空");
			return false;
		}
		const regex = new RegExp(
			`(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)`);
		/* const regex =
			/(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/; */
		if (!regex.test(str)) {
			this.showTip("护照号码格式错误");
			return false;
		}
		return true;
	},
	// 验证邮编
	postcode(str) {
		if (!str || str.length == 0) {
			this.showTip("邮编不能为空");
			return false;
		}
		const regex = new RegExp(`^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$`);
		if (!regex.test(str)) {
			this.showTip("邮编格式错误");
			return false;
		}
		return true;
	},
	// 获取Token
	getToken() {
		let token = cache.get(config.LOGIN_TOKEN, false) || '';
		console.log('Token', token);
		if (token) {
			// TODO 此处需要验证Token
			return token;
		} else {
			return "";
		}
	},
	// 设置Token
	setToken(token) {
		cache.set(config.LOGIN_TOKEN, token);
	},
	// 获取用户信息
	getUserInfo() {
		let userInfo = cache.get(config.LOGIN_USER);
		if (userInfo) {
			return userInfo;
		} else {
			return false;
		}
	},
	// 设置用户信息
	setUserInfo(userInfo) {
		cache.set(config.LOGIN_USER, userInfo);
	},
	// 刷新用户信息
	refreshUserInfo() {
		request.get('userinfo/getUserInfo', {
			role: cache.get('role', false)
		}).then(res => {
			console.log('用户信息', res);
			if (res.code === 1) {
				cache.set('selStore', res.data.store);
				// 保存token
				util.setToken(res.data.token);
				// 保存登录用户
				util.setUserInfo(res.data.user);
				// 事件通知
				uni.$emit('login_success');
			}
		})
	}
};

export default util;